package com.dayuanit.dy15.atm.wx;

import com.alibaba.fastjson.JSON;
import com.dayuanit.dy15.atm.util.ApiConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 和微信打交道的代码 都写到此类中
 */
@Component
public class WxHandler {

    private final Logger logger = LoggerFactory.getLogger("com.dayuanit.dy15.atm.wx");

    @Value("${wx.code.url}")
    private String codeUrl;

    @Value("${wx.appid}")
    private String appId;

    @Value("${wx.redirect.uri}")
    private String redirectUri;

    @Value("${wx.access.token.uri}")
    private String accessTokenUrl;

    @Value("${wx.secret}")
    private String secret;

    @Value("${wx.user.url}")
    private String userInfoUrl;

    /**
     * 第一步 生成codeURL地址
     * @return
     */
    public String createCodeUrl() {
        StringBuilder sx = new StringBuilder();
        sx.append(codeUrl)
                .append("?")
                .append("appid=").append(appId).append("&")
                .append("redirect_uri=").append(redirectUri).append("&")
                .append("response_type=code").append("&")
                .append("scope=snsapi_login");
        logger.info("codeUrl={}", sx.toString());
        return sx.toString();
    }

    /**
     * 通过code获取access_token
     * @param code
     */
    public AccessTokenDTO getAccessToken(String code) {
        StringBuilder sx = new StringBuilder();
        sx.append(accessTokenUrl)
                .append("?")
                .append("appid=").append(appId).append("&")
                .append("secret=").append(secret).append("&")
                .append("code=").append(code).append("&")
                .append("grant_type=").append("authorization_code");

        String result = ApiConnector.get(sx.toString(), null);
        logger.info("微信登录第二步返回信息：{}", result);
        //将第二步的返回结果 反序列化为对象
        AccessTokenDTO accessTokenDTO = JSON.parseObject(result, AccessTokenDTO.class);
        return accessTokenDTO;
    }

    /**
     * 获取微信用户个人信息
     * @param accessToken
     */
    public WxUserInfoDTO getWxUserInfo(String accessToken, String openId) {
        StringBuilder sx = new StringBuilder();
        sx.append(userInfoUrl)
                .append("?")
                .append("access_token=").append(accessToken).append("&")
                .append("openid=").append(openId).append("&");

        String userInfoResult = ApiConnector.get(sx.toString(), null);
        logger.info("微信用户信息：" + userInfoResult);

        WxUserInfoDTO wxUserInfoDTO = JSON.parseObject(userInfoResult, WxUserInfoDTO.class);
        return wxUserInfoDTO;
    }
}
